package com.mastercard.assets.web.struts.forms;

import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblPaises;
import com.mastercard.assets.jpa.TblPaquete;
import com.mastercard.assets.jpa.TblPaqueteRegional;
import com.mastercard.assets.util.dao.MasterCardDAO;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;

public class AssetAsignarPaquetesRegionalForm 
        extends
            ActionForm
{
    
    private TblAsset tblAsset ;
    private TblPaqueteRegional tblPaqueteRegional  ;
    private List< TblPaises > tblPaises ;
    private int libresS ;
    private int libresD ;
    private int[] cvePaisS ;
    private String[] nombrePaisS  ;
    private int[] paquetesAsignadosS ;    
    private int[] manejarPaquetesS ;
    
    private int[] cvePaisD ;
    private String[] nombrePaisD  ;
    private int[] paquetesAsignadosD ;
    private int[] manejarPaquetesD ;
    
    private int cveAsset ;   
    private int operation ;
    

    /**
     * @return the tblAsset
     */
    public TblAsset getTblAsset() {
        return tblAsset;
    }

    /**
     * @param tblAsset the tblAsset to set
     */
    public void setTblAsset(TblAsset tblAsset) {
        this.tblAsset = tblAsset;
    }

    /**
     * @return the tblPaqueteRegional
     */
    public TblPaqueteRegional getTblPaqueteRegional() {
        return tblPaqueteRegional;
    }

    /**
     * @param tblPaqueteRegional the tblPaqueteRegional to set
     */
    public void setTblPaqueteRegional(TblPaqueteRegional tblPaqueteRegional) {
        this.tblPaqueteRegional = tblPaqueteRegional;
    }

    /**
     * @return the tblPaises
     */
    public List< TblPaises > getTblPaises() {
        return tblPaises;
    }

    /**
     * @param tblPaises the tblPaises to set
     */
    public void setTblPaises(List< TblPaises > tblPaises) {
        this.tblPaises = tblPaises;
    }
    
    /**
     * @return the libresS
     */
    public int getLibresS() {
        return libresS;
    }

    /**
     * @param libresS the libresS to set
     */
    public void setLibresS(int libresS) {
        this.libresS = libresS;
    }

    /**
     * @return the libresD
     */
    public int getLibresD() {
        return libresD;
    }

    /**
     * @param libresD the libresD to set
     */
    public void setLibresD(int libresD) {
        this.libresD = libresD;
    }
    
     /**
     * @return the cvePais
     */
    public int[] getCvePaisS() {
        return cvePaisS;
    }

    /**
     * @param cvePais the cvePais to set
     */
    public void setCvePaisS(int[] cvePaisS) {
        this.cvePaisS = cvePaisS;
    }

    /**
     * @return the nombrePais
     */
    public String[] getNombrePaisS() {
        return nombrePaisS;
    }

    /**
     * @param nombrePais the nombrePais to set
     */
    public void setNombrePaisS(String[] nombrePaisS) {
        this.nombrePaisS = nombrePaisS;
    }

    /**
     * @return the paquetesAsignadosS
     */
    public int[] getPaquetesAsignadosS() {
        return paquetesAsignadosS;
    }

    /**
     * @param paquetesAsignadosS the paquetesAsignadosS to set
     */
    public void setPaquetesAsignadosS(int[] paquetesAsignadosS) {
        this.paquetesAsignadosS = paquetesAsignadosS;
    }

    /**
     * @return the manejarPaquetesS
     */
    public int[] getManejarPaquetesS() {
        return manejarPaquetesS;
    }

    /**
     * @param manejarPaquetesS the manejarPaquetesS to set
     */
    public void setManejarPaquetesS(int[] manejarPaquetesS) {
        this.manejarPaquetesS = manejarPaquetesS;
    }
    
    /**
     * @return the cvePais
     */
    public int[] getCvePaisD() {
        return cvePaisD;
    }

    /**
     * @param cvePais the cvePais to set
     */
    public void setCvePaisD(int[] cvePaisD) {
        this.cvePaisD = cvePaisD;
    }

    /**
     * @return the nombrePais
     */
    public String[] getNombrePaisD() {
        return nombrePaisD;
    }

    /**
     * @param nombrePais the nombrePais to set
     */
    public void setNombrePaisD(String[] nombrePaisD) {
        this.nombrePaisD = nombrePaisD;
    }
    
    /**
     * @return the paquetesAsignadosD
     */
    public int[] getPaquetesAsignadosD() {
        return paquetesAsignadosD;
    }

    /**
     * @param paquetesAsignadosD the paquetesAsignadosD to set
     */
    public void setPaquetesAsignadosD(int[] paquetesAsignadosD) {
        this.paquetesAsignadosD = paquetesAsignadosD;
    }
    
    /**
     * @return the manejarPaquetesD
     */
    public int[] getManejarPaquetesD() {
        return manejarPaquetesD;
    }

    /**
     * @param manejarPaquetesD the manejarPaquetesD to set
     */
    public void setManejarPaquetesD(int[] manejarPaquetesD) {
        this.manejarPaquetesD = manejarPaquetesD;
    }
    
    /**
     * @return the cveAsset
     */
    public int getCveAsset() {
        return cveAsset;
    }

    /**
     * @param cveAsset the cveAsset to set
     */
    public void setCveAsset(int cveAsset) {
        this.cveAsset = cveAsset;
    }
    
    /**
     * @return the operation
     */
    public int getOperation() {
        return operation;
    }

    /**
     * @param operation the operation to set
     */
    public void setOperation(int operation) {
        this.operation = operation;
    }

    public ActionErrors validate( ActionMapping mapping , HttpServletRequest request ) {
        ActionErrors errors = new ActionErrors( ) ;
        
        int cuentaSencillosMAS = 0 , cuentaDoblesMAS = 0 , dif1 = 0, dif2 = 0 , dif3 = 0 , dif4 = 0 ;
        List< TblPaises > lp = MasterCardDAO.getPaisesExceptoUno( ) ;
         tblPaises = lp ;
                
        for( int i = 0 ; i < tblPaises.size( ) ; i++ ) {
            
            // En caso de asignar paquetes Sencillos
            if( manejarPaquetesS != null && manejarPaquetesS[i] > 0 ) {
                // Si los paquetesSencillos disponibles son menos que los que quiere asignar...
                if( libresS <  manejarPaquetesS[i] ) {
                    dif1 = libresS - manejarPaquetesS[i] ;
                    // lo convierte a positivo
                    dif1 *= -1 ;
                    errors.add( "ErrorPaquetesSencillos" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesSencillos", new Object[]{new Integer( dif1 ),  nombrePaisS[i] } ) ) ;
                }
                //Los agrega a la cuenta de paquetes sencillos para asignar
                cuentaSencillosMAS += manejarPaquetesS[i] ;
            }
            
            // En caso de asignar paquetes Dobles
            if( manejarPaquetesD != null && manejarPaquetesD[i] > 0 ) {
                // Si los paquetesDobles disponibles son menos que los que quiere asignar...
                if( libresD < manejarPaquetesD[i] ) {
                    dif2 = libresD - manejarPaquetesD[i] ;
                    // lo convierte a positivo
                    dif2 *= -1 ;
                errors.add( "ErrorPaquetesDobles" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesDobles", new Object[]{new Integer( dif2 ),  nombrePaisD[i] } ) ) ;
                }
                //Los agrega a la cuenta de paquetes dobles para asignar
                cuentaDoblesMAS += manejarPaquetesD[i] ;
            }
            
            // En caso de quitar paquetes Sencillos
            if ( manejarPaquetesS != null && manejarPaquetesS[i] < 0 ) {
                int res1 = paquetesAsignadosS[i] +  manejarPaquetesS[i] ;                
                // Si los paqSencillos que quiere regresar son mas de los que tiene
                if( res1 < 0 ) {
                    // lo convierte a positivo
                    res1 *= -1 ;
                    errors.add( "PaquetesSencillosRegresar" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesSencillosRegresar", new Object[]{new Integer( res1 ),  nombrePaisS[i] } ) ) ;
                } else {
                    // CREA LISTA DE PAQUETES SENCILLOS ASIGNADOS A PAIS Y DISPONIBLES EN PAIS
                    List< TblPaqueteRegional > paqAsignados =
                            MasterCardDAO.PaquetesRegionalesPorAssetStatusBanderaYHabitacion( cveAsset , 1 , 2 , 1 , cvePaisS[i] ) ;
                    
                    // SI LA LISTA ESTA VACIA MANDA MESAJE DE ERROR
                    if( paqAsignados.isEmpty( ) ) {
                        errors.add( "PaquetesSencillosRegresarNoHay" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesSencillosAsignadosNo", new Object[]{ nombrePaisS[i] } ) ) ;
                    } else {
                        int res4 = paqAsignados.size( ) + manejarPaquetesS[i] ;
                        // Si los paqDobles que quiere regresar son mas de los que tiene DISPONIBLES
                        if( res4 < 0  ) {
                            errors.add( "PaquetesSencillosRegresarNoDisponibles" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesSencillosAsignadosMenos", new Object[]{ new Integer( res4 ), nombrePaisS[i] } ) ) ;
                        }
                    }
                    
                }
            }
            
            // en caso de quitar paquetes Dobles
            if ( manejarPaquetesD != null && manejarPaquetesD[i] < 0 ) {
                int res2 = paquetesAsignadosD[i] +  manejarPaquetesD[i] ;
                
                if( res2 < 0 ) {
                    // Si los paqDobles que quiere regresar son mas de los que tiene
                    // lo convierte a positivo
                    res2 *= -1 ;
                    errors.add( "PaquetesDoblesRegresar" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesDoblesRegresar", new Object[]{new Integer( res2 ),  nombrePaisD[i] } ) ) ;
                } else {
                    // CREA LISTA DE PAQUETES DOBLES ASIGNADOS A PAIS Y DISPONIBLES EN PAIS
                    List< TblPaqueteRegional > paqAsignados =
                            MasterCardDAO.PaquetesRegionalesPorAssetStatusBanderaYHabitacion( cveAsset , 1 , 2 , 2 , cvePaisD[i] ) ;
                    
                    // SI LA LISTA ESTA VACIA MANDA MESAJE DE ERROR
                    if( paqAsignados.isEmpty( ) ) {
                        errors.add( "PaquetesDoblesRegresarNoHay" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesDoblesAsignadosNo", new Object[]{ nombrePaisD[i] } ) ) ;
                    } else {
                        int res3 = paqAsignados.size( ) + manejarPaquetesD[i] ;
                        // Si los paqDobles que quiere regresar son mas de los que tiene DISPONIBLES
                        if( res3 < 0  ) {
                            errors.add( "PaquetesDoblesRegresarNoDisponibles" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.RegionalesDoblesAsignadosMenos", new Object[]{ new Integer( res3 ), nombrePaisD[i] } ) ) ;
                        }
                    }
                    
                }
                
            } 
                
        }
        
        if(  libresS < cuentaSencillosMAS ) {
            dif3 = libresS - cuentaSencillosMAS ;
            // lo convierte a positivo
            dif3 *= -1 ;
            errors.add( "TotalPaquetesSencillos" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.TotalRegionalesSencillos", new Object[]{ new Integer( dif3 ) } ) ) ;
        }
        
        if( libresD < cuentaDoblesMAS ) {
            dif4 = libresD - cuentaDoblesMAS ;
            // lo convierte a positivo
            dif4 *= -1 ;
            errors.add( "TotalPaquetesDobles" , new ActionMessage( "com.mastercard.assets.web.errors.modules.asset.packages.TotalRegionalesDobles", new Object[]{ new Integer( dif4 ) } ) ) ;
        }
        
        try {
            
            int paquetes = 0 , asignados = 0 , disponibles = 0,
                            Stotales = 0, Sdisponibles = 0, Sasignados = 0,
                            Dtotales = 0, Ddisponibles = 0, Dasignados = 0 ;
         
          tblAsset  = MasterCardDAO.findAssetById( cveAsset ) ;
          cveAsset = tblAsset.getCveAsset( ) ;
         List< TblPaqueteRegional > lpr = MasterCardDAO.getAllPackagesRegionalOfAsset( tblAsset.getCveAsset( ) , 1 ) ;
         
         
         int[] cvePais = new int[lpr.size()] ;
         String[] nombrePais = new String[lpr.size()] ;
         int[] PaquetesAsignadosS = new int[lpr.size()] ;
         int[] PaquetesAsignadosD = new int[lpr.size()] ;
//       int[] manejarPaquetes = new int[lpr.size()] ;
                    
         int[] cvePaisSF = new int[lp.size()] ;
         String[] nombrePaisSF = new String[lp.size()] ;
         int[] paquetesAsignadosSF = new int[lp.size()] ;                    
         int[] manejarPaquetesSF = new int[lp.size()] ;
                    
         int[] cvePaisDF = new int[lp.size()] ;
         String[] nombrePaisDF = new String[lp.size()] ;
         int[] paquetesAsignadosDF = new int[lp.size()] ;
         int[] manejarPaquetesDF = new int[lp.size()] ;
         
         //RECORRE CADA PAQUETE REGIONAL DEL ASSET
                    for( TblPaqueteRegional pR : lpr ) {
                        // Conteo de paquetes totales del Asset
                        if( pR.getBandera( ) == 1 ) {
                            disponibles += 1 ; 
                        } else if ( pR.getBandera( ) == 2 ) {
                            asignados += 1 ;
                        }
                        TblPaquete paq = MasterCardDAO.getPackageWhitCveAndStatus( pR.getPaquete( ) ) ;
                        // Conteo por tipo de Habitación
                        if( pR.getHabitacion( ) == 1 ) {
                            // Cuenta total, asignados y disponibles
                            if( pR.getBandera( ) == 1 ) {
                                Sdisponibles += 1 ;
                            }else if( pR.getBandera( ) == 2 ) {
                                Sasignados += 1 ;
                                cvePais[paquetes] = paq.getTblAsset( ).getTblPais( ).getCvePais( ) ;
                                nombrePais[paquetes] = paq.getTblAsset( ).getTblPais( ).getNombre( ) ;
                                PaquetesAsignadosS[paquetes] += 1 ;
                            }
                            Stotales += 1 ;
                            
                        } else if( pR.getHabitacion( ) == 2 ) {
                            // Cuenta total, asignados y disponibles
                            if( pR.getBandera( ) == 1 ) {
                                Ddisponibles += 1 ;
                            }else if( pR.getBandera( ) == 2 ) {
                                Dasignados += 1 ;
                                cvePais[paquetes] = paq.getTblAsset( ).getTblPais( ).getCvePais( ) ;
                                nombrePais[paquetes] = paq.getTblAsset( ).getTblPais( ).getNombre( ) ;
                                PaquetesAsignadosD[paquetes] += 1 ;
                            }
                            Dtotales += 1 ;
                        }
                        
                        paquetes += 1 ;
                        
                    }
                    
                    int cuenta = 0 ;
                    for( TblPaises pais : lp ) {
                        
                        cvePaisSF[cuenta] = pais.getCvePais() ; nombrePaisSF[cuenta] = pais.getNombre( ) ;
                        paquetesAsignadosSF[cuenta] = 0 ; manejarPaquetesSF[cuenta] = 0 ;
                        
                        cvePaisDF[cuenta] = pais.getCvePais() ; nombrePaisDF[cuenta] = pais.getNombre( ) ;
                        paquetesAsignadosDF[cuenta] = 0 ; manejarPaquetesDF[cuenta] = 0 ;
                        
                        for( int i = 0 ; i < cvePais.length ; i++ ) {
                            
                            if( pais.getCvePais( ) == cvePais[i] ) {
                                
                                if( PaquetesAsignadosS[i] == 1 ) {
                                    paquetesAsignadosSF[cuenta] += 1 ;
                                }else
                                    if( PaquetesAsignadosD[i] == 1 ) {
                                        paquetesAsignadosDF[cuenta] += 1 ;
                                    }                                
                            }
                        }
                        cuenta ++ ;
                    }
                    
                    cvePaisS = cvePaisSF ;
                    nombrePaisS = nombrePaisSF ;
                    paquetesAsignadosS = paquetesAsignadosSF ;                    
//                    manejarPaquetesS = manejarPaquetesSF ;
                    cvePaisD = cvePaisDF ;
                    nombrePaisD = nombrePaisDF ;
                    paquetesAsignadosD = paquetesAsignadosDF ;
//                    manejarPaquetesD = manejarPaquetesDF ;
                    
                    request.setAttribute( "paquetes" , paquetes ) ;
                    request.setAttribute( "asignados" , asignados ) ;
                    request.setAttribute( "disponibles" , disponibles ) ;
                    request.setAttribute( "Stotales" , Stotales ) ;
                    request.setAttribute( "Sdisponibles" , Sdisponibles ) ;
                    request.setAttribute( "Sasignados" , Sasignados ) ;
                    request.setAttribute( "Dtotales" , Dtotales ) ;
                    request.setAttribute( "Ddisponibles" , Ddisponibles ) ;
                    request.setAttribute( "Dasignados" , Dasignados ) ;
            
        }catch( Exception e )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			e.printStackTrace( ) ;
		}
         
        MasterCardDAO.closeEntityManager( ) ;
        return errors ;
        
    }
    
}
